Libraries…

library(readxl)
library(skimr)

Set path :-

setwd("/Users/himanshusahrawat/MBA projects/CPS/R/")

Read the excel data at sheet zero…

data=read_excel("Central parking dataset.xls", sheet = 1)
New names:
data_s=read_excel("Central parking dataset.xls", sheet = 2)
New names:

Removing unwanted coloumns…

names(data)
 [1] "Vehicle"     "Equipment"   "DateIn"      "Time In"     "DateOut"     "Time Out"    "Amount"     
 [8] "TimeDiff"    "Ticket_Type" "Weekday"     "...11"       "...12"       "...13"      
print("--------------------------------------------------------------------------------")
[1] "--------------------------------------------------------------------------------"
names(data_s)
 [1] "Vehicle"     "Equipment"   "DateIn"      "...4"        "DateOut"     "...6"        "Amount"     
 [8] "TimeDiff"    "Ticket_Type" "Weekday"     "...11"       "...12"       "...13"      
data=data[ , c("Vehicle","Equipment","DateIn","Time In","DateOut","Time Out","Amount","TimeDiff","Ticket_Type","Weekday" )]
data_s=data_s[ , c("Vehicle","Equipment","DateIn","...4","DateOut","...6","Amount","TimeDiff","Ticket_Type","Weekday" )]

Renaming Columns for weekend data…

colnames(data_s)[4] <- "Time In"
colnames(data_s)[6] <- "Time Out"

Summary for weekday data…

skim(data)
── Data Summary ────────────────────────
                           Values
Name                       data  
Number of rows             5000  
Number of columns          10    
_______________________          
Column type frequency:           
  character                2     
  numeric                  4     
  POSIXct                  4     
________________________         
Group variables            None  

observations from weekday data :-

── Data Summary ──────────────────────── Values Name data
Number of rows 5000
Number of columns 10
_______________________
Column type frequency:
character 2
numeric 4
POSIXct 4
________________________
Group variables None

── Variable type: character ────────────────────────────────────────── skim_variable n_missing complete_rate min max empty n_unique 1 Ticket_Type 0 1 6 6 0 2 2 Weekday 0 1 6 9 0 5 whitespace 1 0 2 0

── Variable type: numeric ──────────────────────────────────────────── skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 1 Vehicle 0 1 1 0 1 1 1 1 2 Equipment 0 1 5.63 0.913 5 5 5 6 3 Amount 0 1 36.8 28.5 30 30 30 40 4 TimeDiff 0 1 136. 83.9 2 76 122 179 p100 hist 1 1 ▁▁▇▁▁ 2 8 ▇▅▁▁▂ 3 300 ▇▁▁▁▁ 4 722 ▇▅▁▁▁

── Variable type: POSIXct ──────────────────────────────────────────── skim_variable n_missing complete_rate min
1 DateIn 0 1 2009-07-06 00:00:00 2 Time In 0 1 1899-12-31 00:01:00 3 DateOut 0 1 2009-07-06 00:00:00 4 Time Out 0 1 1899-12-31 00:00:00 max median n_unique 1 2012-04-20 00:00:00 2010-12-28 00:00:00 696 2 1899-12-31 23:58:00 1899-12-31 16:24:00 880 3 2012-04-20 00:00:00 2010-12-28 00:00:00 760 4 1899-12-31 23:59:00 1899-12-31 18:11:00 952

Summary for weekend data…

skim(data_s)
── Data Summary ────────────────────────
                           Values
Name                       data_s
Number of rows             4995  
Number of columns          10    
_______________________          
Column type frequency:           
  character                2     
  numeric                  4     
  POSIXct                  4     
________________________         
Group variables            None  

observation from weekend data ….

── Data Summary ──────────────────────── Values Name data_s Number of rows 4995
Number of columns 10
_______________________
Column type frequency:
character 2
numeric 4
POSIXct 4
________________________
Group variables None

── Variable type: character ────────────────────────────────────────── skim_variable n_missing complete_rate min max empty n_unique 1 Ticket_Type 0 1 4 6 0 3 2 Weekday 0 1 6 8 0 2 whitespace 1 0 2 0

── Variable type: numeric ──────────────────────────────────────────── skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 1 Vehicle 0 1 1 0 1 1 1 1 2 Equipment 0 1 5.95 1.13 5 5 6 6 3 Amount 0 1 62.5 31.4 0 50 50 70 4 TimeDiff 0 1 154. 87.7 1 91 141 200 p100 hist 1 1 ▁▁▇▁▁ 2 9 ▇▆▁▃▁ 3 300 ▇▃▁▁▁ 4 713 ▇▆▁▁▁

── Variable type: POSIXct ──────────────────────────────────────────── skim_variable n_missing complete_rate min
1 DateIn 0 1 2009-07-04 00:00:00 2 Time In 0 1 1899-12-31 00:01:00 3 DateOut 0 1 2009-07-04 00:00:00 4 Time Out 0 1 1899-12-31 00:00:00 max median n_unique 1 2012-03-31 00:00:00 2010-10-30 00:00:00 279 2 1899-12-31 23:58:00 1899-12-31 16:39:00 852 3 2012-04-01 00:00:00 2010-10-30 00:00:00 364 4 1899-12-31 23:59:00 1899-12-31 18:35:00 893

plots for length of stay

weekdays

plot(x = data$TimeDiff, y = data$Amount,
    xlab = "Length of Stay",
    ylab = "Amount",
    main = "Weekday"
)

plot(x = data_s$TimeDiff, y = data_s$Amount,
    xlab = "Length of Stay",
    ylab = "Amount",
    main = "Weekend"
)

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6      ✔ purrr   0.3.4 
✔ tibble  3.1.8      ✔ dplyr   1.0.10
✔ tidyr   1.2.1      ✔ stringr 1.4.1 
✔ readr   2.1.3      ✔ forcats 0.5.2 ── Conflicts ──────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
#remove the zero and 300 amount
data = data %>% filter(Amount <300)
plot(x = data$TimeDiff, y = data$Amount,
    xlab = "Length of Stay",
    ylab = "Amount",
    main = "Weekday"
)

data_s = data_s %>% filter(Amount <300) %>% filter(Amount>0)

plot(x = data_s$TimeDiff, y = data_s$Amount,
    xlab = "Length of Stay",
    ylab = "Amount",
    main = "Weekend"
)

library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

Plot for count on daily basis.

library(ggplot2)
ggplot(data, aes(x = Weekday)) +
  geom_bar()

ggplot(data_s, aes(x = Weekday)) +
  geom_bar()

Lets check the size of vehicles for both weekdays and weekends….

data %>% filter(Amount>30 & TimeDiff<181)
data_s %>% filter(Amount>60 & TimeDiff<181)

Adding colloumn for timing, if morning (00:00:00 - 12:00:00), afternoon (12:00:00 - 18:00:00), evening (18:00:00 - 00:00:00)

# library(data.table)
 library(readxl)
# install.packages("skimr")
 library("skimr")
# install.packages("tidyverse")
 library("tidyverse")
# install.packages("plotly")
 library("plotly")
# install.packages("lubridate")
 library("lubridate")

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
# install.packages("recommenderlab")
 library("recommenderlab")
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack

Loading required package: arules

Attaching package: ‘arules’

The following object is masked from ‘package:dplyr’:

    recode

The following objects are masked from ‘package:base’:

    abbreviate, write

Loading required package: proxy

Attaching package: ‘proxy’

The following object is masked from ‘package:Matrix’:

    as.matrix

The following objects are masked from ‘package:stats’:

    as.dist, dist

The following object is masked from ‘package:base’:

    as.matrix

Loading required package: registry
Registered S3 methods overwritten by 'registry':
  method               from 
  print.registry_field proxy
  print.registry_entry proxy
class(data$`Time In`)
[1] "POSIXct" "POSIXt" 
#hour(data$`Time In`)
# Multiple conditions when adding new column to dataframe:
data=data %>% mutate(Timing =
                     case_when((hour(`Time In`) >=00) & (hour(`Time In`)) <12 ~ "Morning", 
                               (hour(`Time In`) >=12) & (hour(`Time In`)) <18 ~ "Afternoon",
                               (hour(`Time In`) >=18) & (hour(`Time In`)) <24 ~ "Evening"))
data_s=data_s %>% mutate(Timing =
                     case_when((hour(`Time In`) >=00) & (hour(`Time In`)) <12 ~ "Morning", 
                               (hour(`Time In`) >=12) & (hour(`Time In`)) <18 ~ "Afternoon",
                               (hour(`Time In`) >=18) & (hour(`Time In`)) <24 ~ "Evening"))
tw = data %>% 
  group_by(Timing) %>%
  summarise(count =n())
  
tw

fig <- plot_ly(tw, labels = ~Timing, values = ~count, type = 'pie')

fig <- fig %>% layout(title = 'Weekday Timing',
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
fig

people are coming in afternoon

tw = data_s %>% 
  group_by(Timing) %>%
  summarise(count =n())


fig <- plot_ly(tw, labels = ~Timing, values = ~count, type = 'pie')

fig <- fig %>% layout(title = 'Weekend Timing',
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
fig

During Saturday Sunday , most of the person are coming in afternoon.

Distribution of time spent by vehicles —–


library(ggplot2)
## Basic histogram from the vector "rating". Each bin is .5 wide.
## These both result in the same output:
ggplot(data, aes(x=TimeDiff)) + geom_histogram(binwidth=10)

# qplot(dat$rating, binwidth=.5)

# Draw with black outline, white fill
ggplot(data, aes(x=TimeDiff)) +
    geom_histogram(binwidth=10, colour="black", fill="white")


# Density curve
ggplot(data, aes(x=TimeDiff)) + geom_density()


# Histogram overlaid with kernel density curve
ggplot(data, aes(x=TimeDiff)) + 
    geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                   binwidth=10,
                   colour="black", fill="white") +
    geom_density(alpha=.2, fill="#FF6666")  # Overlay with transparent density plot

Checking Skew Value

install.packages("moments")
trying URL 'https://cran.rstudio.com/bin/macosx/contrib/4.2/moments_0.14.1.tgz'
Content type 'application/x-gzip' length 54374 bytes (53 KB)
==================================================
downloaded 53 KB

The downloaded binary packages are in
    /var/folders/hk/_k0j74ld46j579pyq03bync00000gn/T//RtmpNqXUjs/downloaded_packages
library(moments)
skewness(data$TimeDiff)
[1] 1.40518

.If the skewness is between -0.5 and 0.5, the data are fairly symmetrical . If the skewness is between -1 and — 0.5 or between 0.5 and 1, the data are moderately skewed . If the skewness is less than -1 or greater than 1, the data are highly skewed

DISTRIBUTION FOR WEEKEND

## Basic histogram from the vector "rating". Each bin is .5 wide.
## These both result in the same output:
ggplot(data_s, aes(x=TimeDiff)) + geom_histogram(binwidth=10)

# qplot(dat$rating, binwidth=.5)

# Draw with black outline, white fill
ggplot(data_s, aes(x=TimeDiff)) +
    geom_histogram(binwidth=10, colour="black", fill="white")


# Density curve
ggplot(data_s, aes(x=TimeDiff)) + geom_density()


# Histogram overlaid with kernel density curve
ggplot(data_s, aes(x=TimeDiff)) + 
    geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                   binwidth=10,
                   colour="black", fill="white") +
    geom_density(alpha=.2, fill="#FF6666")  # Overlay with transparent density plot

skewness(data_s$TimeDiff)
[1] 1.056578

Q.4

People tends to stay longer during weekends.

print("Average stay During weekday")
[1] "Average stay During weekday"
print(mean(data$TimeDiff))
[1] 135.4679
print("Average stay During weekend")
[1] "Average stay During weekend"
print(mean(data_s$TimeDiff))
[1] 151.9696

Yes people tends to stay longer during weekends.

Q.5


data_s=data_s %>% mutate(Timing =
                     case_when((hour(`Time In`) >=00) & (hour(`Time In`)) <14 ~ "Morning", 
                               (hour(`Time In`) >=14) & (hour(`Time In`)) <18 ~ "Afternoon",
                               (hour(`Time In`) >=18) & (hour(`Time In`)) <24 ~ "Evening"))
tw = data_s %>% 
  group_by(Timing) %>%
  summarise(count =n())


fig <- plot_ly(tw, labels = ~Timing, values = ~count, type = 'pie')

fig <- fig %>% layout(title = 'Weekend Timing',
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
fig

Q6.. If charges for first 2 hr is 20 and 10 for every additional hour… financial effect.

new_price <- function(a) {
  b=as.integer(a[8])-120
  amount=20
  while (b>0) {
    amount=amount+10
    b=b-60
  }
  return(amount)
  }
data$newprice = apply(data,1,new_price)
sum(data$Amount)-sum(data$newprice)
[1] 24440

loss of 24440


q.8 analyst claim- aternate hypo- average ocupancy is not utmost 2 hr for weekdays. alpha - 0.05 . pop var=sam var

data_sample=sample_n(data, 500)

## Basic histogram from the vector "rating". Each bin is .5 wide.
## These both result in the same output:
ggplot(data_sample, aes(x=TimeDiff)) + geom_histogram(binwidth=.01)

# qplot(dat$rating, binwidth=.5)

# Draw with black outline, white fill
ggplot(data_sample, aes(x=TimeDiff)) +
    geom_histogram(binwidth=.01, colour="black", fill="white")


# Density curve
ggplot(data_sample, aes(x=TimeDiff)) + geom_density()


# Histogram overlaid with kernel density curve
ggplot(data_sample, aes(x=TimeDiff)) + 
    geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                   binwidth=.01,
                   colour="black", fill="white") +
    geom_density(alpha=.2, fill="#FF6666")

install.packages("BSDA")
library(BSDA)

h null : mean <=120 (claimed value) h alter : mean >120 (opposite)

The alternative hypothesis in each case indicates the direction of divergence of the population mean for x (or difference of means for x and y) from mu (i.e., “greater”, “less”, “two.sided”).

data_sample=sample_n(data, 500)
z.test(x=data_sample$TimeDiff, mu=120, sigma.x=var(data$TimeDiff),alternative = "greater")

The test statistic for the one sample z-test is 0.054417 and the corresponding p-value is 0.4783.

Since this p-value is not less than .05, we have have sufficient evidence to reject the null hypothesis.

Thank you !!!!!

LS0tCnRpdGxlOiAiQ2VudHJhbCBQYXJraW5nIFN5c3RlbSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0CmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgojIyBMaWJyYXJpZXMuLi4KCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShza2ltcikKYGBgCgojIyBTZXQgcGF0aCA6LQoKYGBge3J9CnNldHdkKCIvVXNlcnMvaGltYW5zaHVzYWhyYXdhdC9NQkEgcHJvamVjdHMvQ1BTL1IvIikKYGBgCgojIyBSZWFkIHRoZSBleGNlbCBkYXRhIGF0IHNoZWV0IHplcm8uLi4KCmBgYHtyfQpkYXRhPXJlYWRfZXhjZWwoIkNlbnRyYWwgcGFya2luZyBkYXRhc2V0LnhscyIsIHNoZWV0ID0gMSkKZGF0YV9zPXJlYWRfZXhjZWwoIkNlbnRyYWwgcGFya2luZyBkYXRhc2V0LnhscyIsIHNoZWV0ID0gMikKYGBgCgojIyBSZW1vdmluZyB1bndhbnRlZCBjb2xvdW1ucy4uLgoKYGBge3J9Cm5hbWVzKGRhdGEpCnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCm5hbWVzKGRhdGFfcykKYGBgCgpgYGB7cn0KZGF0YT1kYXRhWyAsIGMoIlZlaGljbGUiLCJFcXVpcG1lbnQiLCJEYXRlSW4iLCJUaW1lIEluIiwiRGF0ZU91dCIsIlRpbWUgT3V0IiwiQW1vdW50IiwiVGltZURpZmYiLCJUaWNrZXRfVHlwZSIsIldlZWtkYXkiICldCmBgYAoKYGBge3J9CmRhdGFfcz1kYXRhX3NbICwgYygiVmVoaWNsZSIsIkVxdWlwbWVudCIsIkRhdGVJbiIsIi4uLjQiLCJEYXRlT3V0IiwiLi4uNiIsIkFtb3VudCIsIlRpbWVEaWZmIiwiVGlja2V0X1R5cGUiLCJXZWVrZGF5IiApXQpgYGAKCiMjIFJlbmFtaW5nIENvbHVtbnMgZm9yIHdlZWtlbmQgZGF0YS4uLgoKYGBge3J9CmNvbG5hbWVzKGRhdGFfcylbNF0gPC0gIlRpbWUgSW4iCmNvbG5hbWVzKGRhdGFfcylbNl0gPC0gIlRpbWUgT3V0IgpgYGAKCiMjIFN1bW1hcnkgZm9yIHdlZWtkYXkgZGF0YS4uLgoKYGBge3IgZWNobz1UUlVFLCBwYWdlZC5wcmludD1UUlVFfQpza2ltKGRhdGEpCmBgYAoKIyMgb2JzZXJ2YXRpb25zIGZyb20gd2Vla2RheSBkYXRhIDotCgrilIDilIAgRGF0YSBTdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBWYWx1ZXMgTmFtZSBkYXRhXApOdW1iZXIgb2Ygcm93cyA1MDAwXApOdW1iZXIgb2YgY29sdW1ucyAxMFwKXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1wKQ29sdW1uIHR5cGUgZnJlcXVlbmN5OlwKY2hhcmFjdGVyIDJcCm51bWVyaWMgNFwKUE9TSVhjdCA0XApcX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cCkdyb3VwIHZhcmlhYmxlcyBOb25lCgrilIDilIAgVmFyaWFibGUgdHlwZTogY2hhcmFjdGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBza2ltX3ZhcmlhYmxlIG5fbWlzc2luZyBjb21wbGV0ZV9yYXRlIG1pbiBtYXggZW1wdHkgbl91bmlxdWUgMSBUaWNrZXRfVHlwZSAwIDEgNiA2IDAgMiAyIFdlZWtkYXkgMCAxIDYgOSAwIDUgd2hpdGVzcGFjZSAxIDAgMiAwCgrilIDilIAgVmFyaWFibGUgdHlwZTogbnVtZXJpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2tpbV92YXJpYWJsZSBuX21pc3NpbmcgY29tcGxldGVfcmF0ZSBtZWFuIHNkIHAwIHAyNSBwNTAgcDc1IDEgVmVoaWNsZSAwIDEgMSAwIDEgMSAxIDEgMiBFcXVpcG1lbnQgMCAxIDUuNjMgMC45MTMgNSA1IDUgNiAzIEFtb3VudCAwIDEgMzYuOCAyOC41IDMwIDMwIDMwIDQwIDQgVGltZURpZmYgMCAxIDEzNi4gODMuOSAyIDc2IDEyMiAxNzkgcDEwMCBoaXN0IDEgMSDiloHiloHilofiloHiloEgMiA4IOKWh+KWheKWgeKWgeKWgiAzIDMwMCDilofiloHiloHiloHiloEgNCA3MjIg4paH4paF4paB4paB4paBCgrilIDilIAgVmFyaWFibGUgdHlwZTogUE9TSVhjdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2tpbV92YXJpYWJsZSBuX21pc3NpbmcgY29tcGxldGVfcmF0ZSBtaW5cCjEgRGF0ZUluIDAgMSAyMDA5LTA3LTA2IDAwOjAwOjAwIDIgVGltZSBJbiAwIDEgMTg5OS0xMi0zMSAwMDowMTowMCAzIERhdGVPdXQgMCAxIDIwMDktMDctMDYgMDA6MDA6MDAgNCBUaW1lIE91dCAwIDEgMTg5OS0xMi0zMSAwMDowMDowMCBtYXggbWVkaWFuIG5fdW5pcXVlIDEgMjAxMi0wNC0yMCAwMDowMDowMCAyMDEwLTEyLTI4IDAwOjAwOjAwIDY5NiAyIDE4OTktMTItMzEgMjM6NTg6MDAgMTg5OS0xMi0zMSAxNjoyNDowMCA4ODAgMyAyMDEyLTA0LTIwIDAwOjAwOjAwIDIwMTAtMTItMjggMDA6MDA6MDAgNzYwIDQgMTg5OS0xMi0zMSAyMzo1OTowMCAxODk5LTEyLTMxIDE4OjExOjAwIDk1MgoKIyMgU3VtbWFyeSBmb3Igd2Vla2VuZCBkYXRhLi4uCgpgYGB7cn0Kc2tpbShkYXRhX3MpCmBgYAoKIyMgb2JzZXJ2YXRpb24gZnJvbSB3ZWVrZW5kIGRhdGEgLi4uLgoK4pSA4pSAIERhdGEgU3VtbWFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgVmFsdWVzIE5hbWUgZGF0YV9zIE51bWJlciBvZiByb3dzIDQ5OTVcCk51bWJlciBvZiBjb2x1bW5zIDEwXApcX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXApDb2x1bW4gdHlwZSBmcmVxdWVuY3k6XApjaGFyYWN0ZXIgMlwKbnVtZXJpYyA0XApQT1NJWGN0IDRcClxfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1xfXF9cX1wKR3JvdXAgdmFyaWFibGVzIE5vbmUKCuKUgOKUgCBWYXJpYWJsZSB0eXBlOiBjaGFyYWN0ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIHNraW1fdmFyaWFibGUgbl9taXNzaW5nIGNvbXBsZXRlX3JhdGUgbWluIG1heCBlbXB0eSBuX3VuaXF1ZSAxIFRpY2tldF9UeXBlIDAgMSA0IDYgMCAzIDIgV2Vla2RheSAwIDEgNiA4IDAgMiB3aGl0ZXNwYWNlIDEgMCAyIDAKCuKUgOKUgCBWYXJpYWJsZSB0eXBlOiBudW1lcmljIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBza2ltX3ZhcmlhYmxlIG5fbWlzc2luZyBjb21wbGV0ZV9yYXRlIG1lYW4gc2QgcDAgcDI1IHA1MCBwNzUgMSBWZWhpY2xlIDAgMSAxIDAgMSAxIDEgMSAyIEVxdWlwbWVudCAwIDEgNS45NSAxLjEzIDUgNSA2IDYgMyBBbW91bnQgMCAxIDYyLjUgMzEuNCAwIDUwIDUwIDcwIDQgVGltZURpZmYgMCAxIDE1NC4gODcuNyAxIDkxIDE0MSAyMDAgcDEwMCBoaXN0IDEgMSDiloHiloHilofiloHiloEgMiA5IOKWh+KWhuKWgeKWg+KWgSAzIDMwMCDilofiloPiloHiloHiloEgNCA3MTMg4paH4paG4paB4paB4paBCgrilIDilIAgVmFyaWFibGUgdHlwZTogUE9TSVhjdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgc2tpbV92YXJpYWJsZSBuX21pc3NpbmcgY29tcGxldGVfcmF0ZSBtaW5cCjEgRGF0ZUluIDAgMSAyMDA5LTA3LTA0IDAwOjAwOjAwIDIgVGltZSBJbiAwIDEgMTg5OS0xMi0zMSAwMDowMTowMCAzIERhdGVPdXQgMCAxIDIwMDktMDctMDQgMDA6MDA6MDAgNCBUaW1lIE91dCAwIDEgMTg5OS0xMi0zMSAwMDowMDowMCBtYXggbWVkaWFuIG5fdW5pcXVlIDEgMjAxMi0wMy0zMSAwMDowMDowMCAyMDEwLTEwLTMwIDAwOjAwOjAwIDI3OSAyIDE4OTktMTItMzEgMjM6NTg6MDAgMTg5OS0xMi0zMSAxNjozOTowMCA4NTIgMyAyMDEyLTA0LTAxIDAwOjAwOjAwIDIwMTAtMTAtMzAgMDA6MDA6MDAgMzY0IDQgMTg5OS0xMi0zMSAyMzo1OTowMCAxODk5LTEyLTMxIDE4OjM1OjAwIDg5MwoKIyMgcGxvdHMgZm9yIGxlbmd0aCBvZiBzdGF5CgojIyB3ZWVrZGF5cwoKYGBge3IgZWNobz1UUlVFfQpwbG90KHggPSBkYXRhJFRpbWVEaWZmLCB5ID0gZGF0YSRBbW91bnQsCiAgICB4bGFiID0gIkxlbmd0aCBvZiBTdGF5IiwKICAgIHlsYWIgPSAiQW1vdW50IiwKICAgIG1haW4gPSAiV2Vla2RheSIKKQpgYGAKCmBgYHtyIGVjaG89VFJVRX0KcGxvdCh4ID0gZGF0YV9zJFRpbWVEaWZmLCB5ID0gZGF0YV9zJEFtb3VudCwKICAgIHhsYWIgPSAiTGVuZ3RoIG9mIFN0YXkiLAogICAgeWxhYiA9ICJBbW91bnQiLAogICAgbWFpbiA9ICJXZWVrZW5kIgopCmBgYAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQojcmVtb3ZlIHRoZSB6ZXJvIGFuZCAzMDAgYW1vdW50CmRhdGEgPSBkYXRhICU+JSBmaWx0ZXIoQW1vdW50IDwzMDApCmBgYAoKYGBge3J9CnBsb3QoeCA9IGRhdGEkVGltZURpZmYsIHkgPSBkYXRhJEFtb3VudCwKICAgIHhsYWIgPSAiTGVuZ3RoIG9mIFN0YXkiLAogICAgeWxhYiA9ICJBbW91bnQiLAogICAgbWFpbiA9ICJXZWVrZGF5IgopCmBgYAoKYGBge3J9CmRhdGFfcyA9IGRhdGFfcyAlPiUgZmlsdGVyKEFtb3VudCA8MzAwKSAlPiUgZmlsdGVyKEFtb3VudD4wKQoKcGxvdCh4ID0gZGF0YV9zJFRpbWVEaWZmLCB5ID0gZGF0YV9zJEFtb3VudCwKICAgIHhsYWIgPSAiTGVuZ3RoIG9mIFN0YXkiLAogICAgeWxhYiA9ICJBbW91bnQiLAogICAgbWFpbiA9ICJXZWVrZW5kIgopCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKYGBgCgpQbG90IGZvciBjb3VudCBvbiBkYWlseSBiYXNpcy4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhLCBhZXMoeCA9IFdlZWtkYXkpKSArCiAgZ2VvbV9iYXIoKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YV9zLCBhZXMoeCA9IFdlZWtkYXkpKSArCiAgZ2VvbV9iYXIoKQpgYGAKCkxldHMgY2hlY2sgdGhlIHNpemUgb2YgdmVoaWNsZXMgZm9yIGJvdGggd2Vla2RheXMgYW5kIHdlZWtlbmRzLi4uLgoKYGBge3J9CmRhdGEgJT4lIGZpbHRlcihBbW91bnQ+MzAgJiBUaW1lRGlmZjwxODEpCmBgYAoKYGBge3J9CmRhdGFfcyAlPiUgZmlsdGVyKEFtb3VudD42MCAmIFRpbWVEaWZmPDE4MSkKYGBgCgpBZGRpbmcgY29sbG91bW4gZm9yIHRpbWluZywgaWYgbW9ybmluZyAoMDA6MDA6MDAgLSAxMjowMDowMCksIGFmdGVybm9vbiAoMTI6MDA6MDAgLSAxODowMDowMCksIGV2ZW5pbmcgKDE4OjAwOjAwIC0gMDA6MDA6MDApCgpgYGB7cn0KIyBsaWJyYXJ5KGRhdGEudGFibGUpCiBsaWJyYXJ5KHJlYWR4bCkKIyBpbnN0YWxsLnBhY2thZ2VzKCJza2ltciIpCiBsaWJyYXJ5KCJza2ltciIpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKIGxpYnJhcnkoInRpZHl2ZXJzZSIpCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikKIGxpYnJhcnkoInBsb3RseSIpCiMgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikKIGxpYnJhcnkoImx1YnJpZGF0ZSIpCiMgaW5zdGFsbC5wYWNrYWdlcygicmVjb21tZW5kZXJsYWIiKQogbGlicmFyeSgicmVjb21tZW5kZXJsYWIiKQpgYGAKCmBgYHtyfQpjbGFzcyhkYXRhJGBUaW1lIEluYCkKYGBgCgpgYGB7cn0KI2hvdXIoZGF0YSRgVGltZSBJbmApCmBgYAoKYGBge3J9CiMgTXVsdGlwbGUgY29uZGl0aW9ucyB3aGVuIGFkZGluZyBuZXcgY29sdW1uIHRvIGRhdGFmcmFtZToKZGF0YT1kYXRhICU+JSBtdXRhdGUoVGltaW5nID0KICAgICAgICAgICAgICAgICAgICAgY2FzZV93aGVuKChob3VyKGBUaW1lIEluYCkgPj0wMCkgJiAoaG91cihgVGltZSBJbmApKSA8MTIgfiAiTW9ybmluZyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvdXIoYFRpbWUgSW5gKSA+PTEyKSAmIChob3VyKGBUaW1lIEluYCkpIDwxOCB+ICJBZnRlcm5vb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvdXIoYFRpbWUgSW5gKSA+PTE4KSAmIChob3VyKGBUaW1lIEluYCkpIDwyNCB+ICJFdmVuaW5nIikpCmBgYAoKYGBge3J9CmRhdGFfcz1kYXRhX3MgJT4lIG11dGF0ZShUaW1pbmcgPQogICAgICAgICAgICAgICAgICAgICBjYXNlX3doZW4oKGhvdXIoYFRpbWUgSW5gKSA+PTAwKSAmIChob3VyKGBUaW1lIEluYCkpIDwxMiB+ICJNb3JuaW5nIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG91cihgVGltZSBJbmApID49MTIpICYgKGhvdXIoYFRpbWUgSW5gKSkgPDE4IH4gIkFmdGVybm9vbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG91cihgVGltZSBJbmApID49MTgpICYgKGhvdXIoYFRpbWUgSW5gKSkgPDI0IH4gIkV2ZW5pbmciKSkKYGBgCgpgYGB7cn0KdHcgPSBkYXRhICU+JSAKICBncm91cF9ieShUaW1pbmcpICU+JQogIHN1bW1hcmlzZShjb3VudCA9bigpKQogIApgYGAKCmBgYHtyfQp0dwpgYGAKCmBgYHtyfQoKZmlnIDwtIHBsb3RfbHkodHcsIGxhYmVscyA9IH5UaW1pbmcsIHZhbHVlcyA9IH5jb3VudCwgdHlwZSA9ICdwaWUnKQoKZmlnIDwtIGZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJ1dlZWtkYXkgVGltaW5nJywKICAgICAgICAgeGF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRkFMU0UsIHNob3d0aWNrbGFiZWxzID0gRkFMU0UpLAogICAgICAgICB5YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBGQUxTRSwgemVyb2xpbmUgPSBGQUxTRSwgc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSkpCmZpZwpgYGAKCnBlb3BsZSBhcmUgY29taW5nIGluIGFmdGVybm9vbgoKYGBge3J9CnR3ID0gZGF0YV9zICU+JSAKICBncm91cF9ieShUaW1pbmcpICU+JQogIHN1bW1hcmlzZShjb3VudCA9bigpKQoKCmZpZyA8LSBwbG90X2x5KHR3LCBsYWJlbHMgPSB+VGltaW5nLCB2YWx1ZXMgPSB+Y291bnQsIHR5cGUgPSAncGllJykKCmZpZyA8LSBmaWcgJT4lIGxheW91dCh0aXRsZSA9ICdXZWVrZW5kIFRpbWluZycsCiAgICAgICAgIHhheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFLCB6ZXJvbGluZSA9IEZBTFNFLCBzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UsIHplcm9saW5lID0gRkFMU0UsIHNob3d0aWNrbGFiZWxzID0gRkFMU0UpKQpmaWcKYGBgCgpEdXJpbmcgU2F0dXJkYXkgU3VuZGF5ICwgbW9zdCBvZiB0aGUgcGVyc29uIGFyZSBjb21pbmcgaW4gYWZ0ZXJub29uLgoKRGlzdHJpYnV0aW9uIG9mIHRpbWUgc3BlbnQgYnkgdmVoaWNsZXMgLS0tLS0KCmBgYHtyfQoKbGlicmFyeShnZ3Bsb3QyKQoKYGBgCgpgYGB7cn0KIyMgQmFzaWMgaGlzdG9ncmFtIGZyb20gdGhlIHZlY3RvciAicmF0aW5nIi4gRWFjaCBiaW4gaXMgLjUgd2lkZS4KIyMgVGhlc2UgYm90aCByZXN1bHQgaW4gdGhlIHNhbWUgb3V0cHV0OgpnZ3Bsb3QoZGF0YSwgYWVzKHg9VGltZURpZmYpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPTEwKQojIHFwbG90KGRhdCRyYXRpbmcsIGJpbndpZHRoPS41KQoKIyBEcmF3IHdpdGggYmxhY2sgb3V0bGluZSwgd2hpdGUgZmlsbApnZ3Bsb3QoZGF0YSwgYWVzKHg9VGltZURpZmYpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0xMCwgY29sb3VyPSJibGFjayIsIGZpbGw9IndoaXRlIikKCiMgRGVuc2l0eSBjdXJ2ZQpnZ3Bsb3QoZGF0YSwgYWVzKHg9VGltZURpZmYpKSArIGdlb21fZGVuc2l0eSgpCgojIEhpc3RvZ3JhbSBvdmVybGFpZCB3aXRoIGtlcm5lbCBkZW5zaXR5IGN1cnZlCmdncGxvdChkYXRhLCBhZXMoeD1UaW1lRGlmZikpICsgCiAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksICAgICAgIyBIaXN0b2dyYW0gd2l0aCBkZW5zaXR5IGluc3RlYWQgb2YgY291bnQgb24geS1heGlzCiAgICAgICAgICAgICAgICAgICBiaW53aWR0aD0xMCwKICAgICAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLCBmaWxsPSJ3aGl0ZSIpICsKICAgIGdlb21fZGVuc2l0eShhbHBoYT0uMiwgZmlsbD0iI0ZGNjY2NiIpICAjIE92ZXJsYXkgd2l0aCB0cmFuc3BhcmVudCBkZW5zaXR5IHBsb3QKYGBgCgpDaGVja2luZyBTa2V3IFZhbHVlCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygibW9tZW50cyIpCmxpYnJhcnkobW9tZW50cykKYGBgCgpgYGB7cn0Kc2tld25lc3MoZGF0YSRUaW1lRGlmZikKYGBgCgouSWYgdGhlIHNrZXduZXNzIGlzIGJldHdlZW4gLTAuNSBhbmQgMC41LCB0aGUgZGF0YSBhcmUgZmFpcmx5IHN5bW1ldHJpY2FsIC4gSWYgdGhlIHNrZXduZXNzIGlzIGJldHdlZW4gLTEgYW5kIC0tLSAwLjUgb3IgYmV0d2VlbiAwLjUgYW5kIDEsIHRoZSBkYXRhIGFyZSBtb2RlcmF0ZWx5IHNrZXdlZCAuIElmIHRoZSBza2V3bmVzcyBpcyBsZXNzIHRoYW4gLTEgb3IgZ3JlYXRlciB0aGFuIDEsIHRoZSBkYXRhIGFyZSBoaWdobHkgc2tld2VkCgpESVNUUklCVVRJT04gRk9SIFdFRUtFTkQKCmBgYHtyfQojIyBCYXNpYyBoaXN0b2dyYW0gZnJvbSB0aGUgdmVjdG9yICJyYXRpbmciLiBFYWNoIGJpbiBpcyAuNSB3aWRlLgojIyBUaGVzZSBib3RoIHJlc3VsdCBpbiB0aGUgc2FtZSBvdXRwdXQ6CmdncGxvdChkYXRhX3MsIGFlcyh4PVRpbWVEaWZmKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0xMCkKIyBxcGxvdChkYXQkcmF0aW5nLCBiaW53aWR0aD0uNSkKCiMgRHJhdyB3aXRoIGJsYWNrIG91dGxpbmUsIHdoaXRlIGZpbGwKZ2dwbG90KGRhdGFfcywgYWVzKHg9VGltZURpZmYpKSArCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0xMCwgY29sb3VyPSJibGFjayIsIGZpbGw9IndoaXRlIikKCiMgRGVuc2l0eSBjdXJ2ZQpnZ3Bsb3QoZGF0YV9zLCBhZXMoeD1UaW1lRGlmZikpICsgZ2VvbV9kZW5zaXR5KCkKCiMgSGlzdG9ncmFtIG92ZXJsYWlkIHdpdGgga2VybmVsIGRlbnNpdHkgY3VydmUKZ2dwbG90KGRhdGFfcywgYWVzKHg9VGltZURpZmYpKSArIAogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCAgICAgICMgSGlzdG9ncmFtIHdpdGggZGVuc2l0eSBpbnN0ZWFkIG9mIGNvdW50IG9uIHktYXhpcwogICAgICAgICAgICAgICAgICAgYmlud2lkdGg9MTAsCiAgICAgICAgICAgICAgICAgICBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArCiAgICBnZW9tX2RlbnNpdHkoYWxwaGE9LjIsIGZpbGw9IiNGRjY2NjYiKSAgIyBPdmVybGF5IHdpdGggdHJhbnNwYXJlbnQgZGVuc2l0eSBwbG90CmBgYAoKYGBge3J9CnNrZXduZXNzKGRhdGFfcyRUaW1lRGlmZikKYGBgCgpRLjQKClBlb3BsZSB0ZW5kcyB0byBzdGF5IGxvbmdlciBkdXJpbmcgd2Vla2VuZHMuCgpgYGB7cn0KcHJpbnQoIkF2ZXJhZ2Ugc3RheSBEdXJpbmcgd2Vla2RheSIpCnByaW50KG1lYW4oZGF0YSRUaW1lRGlmZikpCmBgYAoKYGBge3J9CnByaW50KCJBdmVyYWdlIHN0YXkgRHVyaW5nIHdlZWtlbmQiKQpwcmludChtZWFuKGRhdGFfcyRUaW1lRGlmZikpCmBgYAoKWWVzIHBlb3BsZSB0ZW5kcyB0byBzdGF5IGxvbmdlciBkdXJpbmcgd2Vla2VuZHMuCgpRLjUKCmBgYHtyfQoKZGF0YV9zPWRhdGFfcyAlPiUgbXV0YXRlKFRpbWluZyA9CiAgICAgICAgICAgICAgICAgICAgIGNhc2Vfd2hlbigoaG91cihgVGltZSBJbmApID49MDApICYgKGhvdXIoYFRpbWUgSW5gKSkgPDE0IH4gIk1vcm5pbmciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3VyKGBUaW1lIEluYCkgPj0xNCkgJiAoaG91cihgVGltZSBJbmApKSA8MTggfiAiQWZ0ZXJub29uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3VyKGBUaW1lIEluYCkgPj0xOCkgJiAoaG91cihgVGltZSBJbmApKSA8MjQgfiAiRXZlbmluZyIpKQpgYGAKCmBgYHtyfQp0dyA9IGRhdGFfcyAlPiUgCiAgZ3JvdXBfYnkoVGltaW5nKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPW4oKSkKCgpmaWcgPC0gcGxvdF9seSh0dywgbGFiZWxzID0gflRpbWluZywgdmFsdWVzID0gfmNvdW50LCB0eXBlID0gJ3BpZScpCgpmaWcgPC0gZmlnICU+JSBsYXlvdXQodGl0bGUgPSAnV2Vla2VuZCBUaW1pbmcnLAogICAgICAgICB4YXhpcyA9IGxpc3Qoc2hvd2dyaWQgPSBGQUxTRSwgemVyb2xpbmUgPSBGQUxTRSwgc2hvd3RpY2tsYWJlbHMgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFLCB6ZXJvbGluZSA9IEZBTFNFLCBzaG93dGlja2xhYmVscyA9IEZBTFNFKSkKZmlnCmBgYAoKUTYuLiBJZiBjaGFyZ2VzIGZvciBmaXJzdCAyIGhyIGlzIDIwIGFuZCAxMCBmb3IgZXZlcnkgYWRkaXRpb25hbCBob3VyLi4uIGZpbmFuY2lhbCBlZmZlY3QuCgpgYGB7cn0KbmV3X3ByaWNlIDwtIGZ1bmN0aW9uKGEpIHsKICBiPWFzLmludGVnZXIoYVs4XSktMTIwCiAgYW1vdW50PTIwCiAgd2hpbGUgKGI+MCkgewogICAgYW1vdW50PWFtb3VudCsxMAogICAgYj1iLTYwCiAgfQogIHJldHVybihhbW91bnQpCiAgfQpgYGAKCmBgYHtyfQpkYXRhJG5ld3ByaWNlID0gYXBwbHkoZGF0YSwxLG5ld19wcmljZSkKYGBgCgpgYGB7cn0Kc3VtKGRhdGEkQW1vdW50KS1zdW0oZGF0YSRuZXdwcmljZSkKYGBgCgpsb3NzIG9mIDI0NDQwCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcS44IGFuYWx5c3QgY2xhaW0tIGF0ZXJuYXRlIGh5cG8tIGF2ZXJhZ2Ugb2N1cGFuY3kgaXMgbm90IHV0bW9zdCAyIGhyIGZvciB3ZWVrZGF5cy4gYWxwaGEgLSAwLjA1IC4gcG9wIHZhcj1zYW0gdmFyCgoKYGBge3J9CmRhdGFfc2FtcGxlPXNhbXBsZV9uKGRhdGEsIDUwMCkKYGBgCgoKYGBge3J9CgojIyBCYXNpYyBoaXN0b2dyYW0gZnJvbSB0aGUgdmVjdG9yICJyYXRpbmciLiBFYWNoIGJpbiBpcyAuNSB3aWRlLgojIyBUaGVzZSBib3RoIHJlc3VsdCBpbiB0aGUgc2FtZSBvdXRwdXQ6CmdncGxvdChkYXRhX3NhbXBsZSwgYWVzKHg9VGltZURpZmYpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSkKIyBxcGxvdChkYXQkcmF0aW5nLCBiaW53aWR0aD0uNSkKCiMgRHJhdyB3aXRoIGJsYWNrIG91dGxpbmUsIHdoaXRlIGZpbGwKZ2dwbG90KGRhdGFfc2FtcGxlLCBhZXMoeD1UaW1lRGlmZikpICsKICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJibGFjayIsIGZpbGw9IndoaXRlIikKCiMgRGVuc2l0eSBjdXJ2ZQpnZ3Bsb3QoZGF0YV9zYW1wbGUsIGFlcyh4PVRpbWVEaWZmKSkgKyBnZW9tX2RlbnNpdHkoKQoKIyBIaXN0b2dyYW0gb3ZlcmxhaWQgd2l0aCBrZXJuZWwgZGVuc2l0eSBjdXJ2ZQpnZ3Bsb3QoZGF0YV9zYW1wbGUsIGFlcyh4PVRpbWVEaWZmKSkgKyAKICAgIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgICAgICAjIEhpc3RvZ3JhbSB3aXRoIGRlbnNpdHkgaW5zdGVhZCBvZiBjb3VudCBvbiB5LWF4aXMKICAgICAgICAgICAgICAgICAgIGJpbndpZHRoPS4wMSwKICAgICAgICAgICAgICAgICAgIGNvbG91cj0iYmxhY2siLCBmaWxsPSJ3aGl0ZSIpICsKICAgIGdlb21fZGVuc2l0eShhbHBoYT0uMiwgZmlsbD0iI0ZGNjY2NiIpCmBgYAoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIkJTREEiKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KEJTREEpCmBgYAoKaCBudWxsIDogbWVhbiA8PTEyMCAgKGNsYWltZWQgdmFsdWUpCmggYWx0ZXIgOiBtZWFuID4xMjAgKG9wcG9zaXRlKQoKVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaW4gZWFjaCBjYXNlIGluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIGRpdmVyZ2VuY2Ugb2YgdGhlIHBvcHVsYXRpb24gbWVhbiBmb3IgeCAob3IgZGlmZmVyZW5jZSBvZiBtZWFucyBmb3IgeCBhbmQgeSkgZnJvbSBtdSAoaS5lLiwgImdyZWF0ZXIiLCAibGVzcyIsICJ0d28uc2lkZWQiKS4KCmBgYHtyfQpkYXRhX3NhbXBsZT1zYW1wbGVfbihkYXRhLCA1MDApCnoudGVzdCh4PWRhdGFfc2FtcGxlJFRpbWVEaWZmLCBtdT0xMjAsIHNpZ21hLng9dmFyKGRhdGEkVGltZURpZmYpLGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQpgYGAKClRoZSB0ZXN0IHN0YXRpc3RpYyBmb3IgdGhlIG9uZSBzYW1wbGUgei10ZXN0IGlzIDAuMDU0NDE3IGFuZCB0aGUgY29ycmVzcG9uZGluZyBwLXZhbHVlIGlzIDAuNDc4My4KClNpbmNlIHRoaXMgcC12YWx1ZSBpcyBub3QgbGVzcyB0aGFuIC4wNSwgd2UgaGF2ZSBoYXZlIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuCgoKClRoYW5rIHlvdSAhISEhIQo=